package org.duang.core;

import javax.servlet.ServletContext;

import org.duang.aop.ProxyManager;
import org.duang.config.Config;
import org.duang.config.InstanceFactory;
import org.duang.handles.Handles;
import org.duang.ioc.Import;
import org.duang.kit.ClassKit;
import org.duang.kit.ObjectKit;
import org.duang.kit.ToolsKit;
import org.duang.plugins.EventPlugin;
import org.duang.plugins.LogBackPlugin;
import org.duang.plugins.Plugins;
import org.duang.plugins.ProxyPlugin;
import org.duang.upload.OreillyCos;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MVC {

	private static Logger logger = LoggerFactory.getLogger(MVC.class);
	private static IDuang duangFrameword = null;

	/**
	 *  启动初始化顺序, 不能变!
	 * 
	 * @param servletContext
	 */
	public static void init(ServletContext servletContext) {
		InstanceFactory.ServletContext(servletContext);
		// 初始化 IDuang
		initIDuang();
		// 初始化插件
		initPlugins();
		// 扫描Controller, Service, Entity, Monitor class
		initClass2Map();		
		// 初始化全局拦截器
		initInterceptor();
		// 初始化Routes, 将Controller里的Method与请求URL关联起来
		initRoutes();
		// 初始化Service注入
		initService();
		// 初始化Action的处理器
		initHandles();
		// 初始化文件上传jar
		initOreillyCos();
		// 初始化其它工具类
		newInstanceDuang();
	}

	private static void initClass2Map() {
		ClassKit.scanClass2Map();
	}

	private static void initRoutes() {
		Routes.init();
	}

	private static void initHandles() {
		Handles.init();
	}

	private static void initService() {
		try {
			IocHepler.init();
		} catch (Exception e) {
			e.printStackTrace();
			java.lang.Runtime.getRuntime().exit(0);
		}
	}

	private static void initPlugins() {
		Plugins.init();
	}

	private static void initInterceptor() {
//		 InstanceFactory.setInterceptor(new com.security.ShiroInterceptor());
	}

	private static void initOreillyCos() {
		OreillyCos.init();
	}

	/**
	 * 框架启动到最后执行的方法
	 */
	private static void newInstanceDuang() {
		duangFrameword.initDuang();
		ProxyManager.initAnnotation(); // 初始化注解
		logger.warn("instance " + duangFrameword.getClass().getName() + " success!");
	}
	
	/**
	 * 框架启动后第一时间执行的方法
	 */
	private static void initIDuang() {
		String configClass = Config.getMvcConfigPackagePath();
		if (ToolsKit.isEmpty(configClass))
			throw new RuntimeException("IDuang子类路径不能为空!");
		try {
			initData();
			duangFrameword = ObjectKit.newInstance(configClass);
			duangFrameword.addPlugin();
			duangFrameword.addInterceptor();
			duangFrameword.addHandler();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
			throw new RuntimeException("不能创建类: " + configClass, e);
		}
	}
	
	private static void initData() {
		InstanceFactory.setImportAnnot(Import.class);	//初始化导入注解
		InstanceFactory.setPlugin(LogBackPlugin.getInstance());
		InstanceFactory.setPlugin(ProxyPlugin.getInstance());
		InstanceFactory.setPlugin(EventPlugin.getInstance());
	}
}
